from PyQt5.QtWidgets import *       #部件，控件相关
from PyQt5.QtGui import *           #图片相关
from PyQt5.QtCore import *          #事件相关(鼠标等事件)

import sys        

from ui.Ui_main_widget import Ui_MainWidget
from utils import *

# # 标志棋子状态
# # EMPTY 0表示没有棋子，BLACK 1表示黑棋，WHITE 2表示白棋
# EMPTY = 0
# BLACK = 1
# WHITE = 2  


#自定义窗口，继承窗口
class MyWidget(QWidget):
    
    def __init__(self, parent=None):
        super().__init__(parent)
        
        self.ui = Ui_MainWidget()           #创建UI对象
        self.ui.setupUi(self)               #调用对象的函数
        
        self.setMinimumSize(800,700)        #设置最小屏幕大小
        
        self.setWindowIcon(QIcon("./img/豆包.jpg"))
        
        #设置棋子默认状态为黑棋
        self.currentRole = BLACK
        #显示黑子的label图片，隐藏白字的label图片
        self.ui.labelBlack.show()
        self.ui.labelWhite.hide()
        
        #获取顶部倒计时显示屏
        self.topTimer = QTimer()
        self.n = 15     #设置定时器默认倒计时为15
        self.ui.lcdTimer.display(self.n)        #将倒计时放入定时器
        self.topTimer.timeout.connect(self.topTimerSlot)        #绑定槽
        self.topTimer.start(1000)
        
        self.init_ui()

    def init_ui(self):
        
        #棋盘起点
        self.x = -1
        self.y = -1
        
        #格子宽高
        self.gripWidth = -1
        self.gripHeight = -1
         
        self.index_x = -1       #鼠标点击位置的下标x
        self.index_y = -1       #鼠标点击位置的下标y
        
        
        # 创建一个8x8的二维数组
        # self.chess = [[EMPTY for _ in range(8)] for _ in range(8)]
        self.chess = [
            [EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY],
            [EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY],
            [EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY],
            [EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY],
            [EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY],
            [EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY],
            [EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY],
            [EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY],
        ]
        # 设置棋盘中间4个棋子状态   
        self.chess[3][3] = BLACK
        self.chess[3][4] = WHITE
        self.chess[4][3] = WHITE
        self.chess[4][4] = BLACK
        
    #绘图事件
    def paintEvent(self, event):
    
        #创建画家，在窗口上绘图
        painter = QPainter(self)
        
        #画背景图片
        painter.drawPixmap(0,0,self.width(),self.height(),QPixmap("./img/棋盘.jpg"))
    
        #画棋盘
        self.gripWidth = self.width() // 12    #格子宽度
        self.gripHeight = self.height()  // 12   #格子高度
        
        self.x = self.gripWidth *2      #起点x
        self.y = self.gripHeight *2     #起点y
        
        for i in range(9):
            #画横线
            painter.drawLine(self.x , self.y + self.gripHeight * i , self.x + self.gripWidth *8 , self.y + self.gripHeight * i)
            #画竖线
            painter.drawLine(self.x + self.gripWidth * i, self.y, self.x + self.gripWidth * i, self.y + self.gripHeight * 8)
        
        #画棋子
        for i in range(8):
            for j in range(8):
                if self.chess[i][j] == BLACK:
                    painter.drawPixmap(self.x + self.gripWidth * j, self.y + self.gripHeight * i, self.gripWidth, self.gripHeight, QPixmap("./img/black.png"))
                elif self.chess[i][j] == WHITE:
                    painter.drawPixmap(self.x + self.gripWidth * j, self.y + self.gripHeight * i, self.gripWidth, self.gripHeight, QPixmap("./img/white.png"))
                    
        
        #落子位置，画绿框
        if self.index_x != -1:
            
            #先更新画笔
            pen = QPen(Qt.green, 2)
            #把画笔给画家
            painter.setPen(pen)
            
            painter.drawRect(self.index_x * self.gripWidth + self.x,
                             self.index_y * self.gripHeight + self.y,
                             self.gripWidth, self.gripHeight)
        
        
        
    #鼠标点击事件
    def mousePressEvent(self, event:QMouseEvent):

        #获取鼠标点击的坐标
        self.mouse_x = event.x()
        self.mouse_y = event.y()
        
        #将点击的坐标转化为下标
        self.index_x = (self.mouse_x - self.x) // self.gripWidth
        self.index_y = (self.mouse_y - self.y) // self.gripHeight
                
        #判断下标是否在棋盘内
        if self.index_x >= 0 and self.index_x <= 7 and self.index_y >= 0 and self.index_y <= 7:
            
            #判断该位置是否有棋子
            if self.chess[self.index_y][self.index_x] == EMPTY:
                #将该位置的棋子状态设置为黑棋
                #self.chess[self.index_y][self.index_x] = self.currentRole
                #调用吃子的函数
                self.eat_num = judge_rule(self.index_y, self.index_x, self.chess, self.currentRole, eat_chess=True)
                print(f'可以吃子的位置数 = {self.eat_num}')
                if self.eat_num > 0:
                    #更新状态
                    self.update()
                    #切换角色
                    self.switch_status()

        else :
            self.index_x = -1
            self.index_y = -1
            
        #打印下标
        print(f'鼠标点击的坐标，x:{self.index_x}, y:{self.index_y}')
        
    #切换棋子的状态
    def switch_status(self):
        
        #每次切换状态都要更新事件
        self.n = 15
        self.ui.lcdTimer.display(self.n)
        
        self.judge_isWin()      #判断输赢
        
        print("当前角色状态为：",self.currentRole)
        
        if self.currentRole == BLACK:   #如果当前为黑子
            self.currentRole = WHITE
            self.ui.labelWhite.show()
            self.ui.labelBlack.hide()
            self.machine_play()
        else:                           #当前为白字
            self.currentRole = BLACK    
            self.ui.labelBlack.show()
            self.ui.labelWhite.hide()
        #如果当前为白子
     
     #顶部的计时器的槽函数   
    def topTimerSlot(self) :
        self.n -= 1
        self.ui.lcdTimer.display(self.n)
        if self.n == 0:
            self.switch_status()
    
    #将黑白棋的棋子数量显示到LCD屏幕,需要获取当前黑子和白子的数量
    #遍历所有的棋子，如果都没法吃子了，就要根据剩余的棋子数量判断输赢
    def judge_isWin(self):
        
        Black_Num = 0       #黑子数
        White_Num = 0       #白字数
        
        self.is_Over = True      #查看是否能结束游戏
        
        for i in range(8):
            for j in range(8):
                if self.chess[i][j] == BLACK:
                    Black_Num += 1
                elif self.chess[i][j] == WHITE:
                    White_Num += 1
                    
                #只有是空的棋子才能进入这个判断，非空无需判断
                if self.chess[i][j] == EMPTY:
                    #判断是否能吃子，>0 表示可以吃子，那么无法结束游戏
                    if judge_rule(i, j, self.chess, self.currentRole, eat_chess=False) > 0:
                        self.is_Over = False
                        #break          #不要使用break，因为还有遍历后续的黑白棋子的个数
        
        #将棋子数量显示到屏幕上
        self.ui.lcdBlack.display(Black_Num)
        self.ui.lcdWhite.display(White_Num)
        
        #为false就不需要判断是否结束游戏了
        if self.is_Over == False:
            return
        
        #能到这里说明可以判断游戏输赢了 self.is_Over == True
        
        #停止计时器
        if self.topTimer.isActive():
            self.topTimer.stop()
        
        print(f'结束游戏，剩余黑子数量：{Black_Num}, 白子数量：{White_Num}')
        
        #判断黑子和白字的数量，弹出结果窗口
        if Black_Num > White_Num:
            #三个参数，父对象，窗口标题，内容
            QMessageBox.information(self, "游戏结束","小黑子赢了")
        elif Black_Num < White_Num:
            QMessageBox.information(self, "游戏结束","白子赢了")
        else:
            QMessageBox.information(self, "游戏结束","平局")

    #白子由机器下
    def machine_play(self):
        
        #用来存储得到的位置下标
        self.index_x = self.index_y = -1 
        
        for i in range(8):
            for j in range(8):
                
                #只有是空的棋子才能进入这个判断，非空无需判断
                if self.chess[i][j] == EMPTY:
                    #判断是否能吃子，>0 表示可以吃子，那么无法结束游戏
                    if judge_rule(i, j, self.chess, self.currentRole, eat_chess=False) > 0:
                        self.index_x = j
                        self.index_y = i
                        print('x,y = ',self.index_x, self.index_y)
                        break
            if self.index_y != -1:break
        
        
        #白子吃子
        if self.index_x != -1:
            judge_rule(self.index_x, self.index_y, self.chess, WHITE, True)
            self.update()           #更新状态
            self.switch_status()    #切换为黑子
            

        
        
        
# 作为主函数才会执行
if __name__ == '__main__':
    
    # 创建应用程序
    app = QApplication(sys.argv)

    # 创建窗口
    w = MyWidget()
    
    #显示窗口
    w.show()

    #等待窗口停止
    sys.exit(app.exec())